package com.obligatorio.persist.dao;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import com.obligatorio.domain.EstadosMail;
import com.obligatorio.domain.Mensaje;
import com.obligatorio.domain.Usuario;

@Stateless
@SuppressWarnings("unchecked")
public class MensajeDAOBean implements MensajeDAOLocal {
	private static final Logger log = Logger.getLogger(MensajeDAOBean.class
			.getName());

	@PersistenceContext(unitName = "JPA_UNIT_OBL")
	EntityManager em;

	@Override
	public Boolean enviarMensaje(Mensaje message) throws Exception {
		Boolean result = false;
		try {
			em.persist(message);
			Mensaje tmpMensaje = new Mensaje();
			tmpMensaje.setAsunto(message.getAsunto());
			tmpMensaje.setMensjae(message.getMensaje());
			tmpMensaje.setIdUsuarioFrom(message.getIdUsuarioFrom());
			tmpMensaje.setIdUsuarioTo(message.getIdUsuarioTo());
			tmpMensaje.setBuzon(message.getIdUsuarioFrom().getBuzon());
			tmpMensaje.setEstado(EstadosMail.Enviados);
			tmpMensaje.setEstadoLeido(EstadosMail.Marcar_Como_NoLeido);
			em.persist(tmpMensaje);
			result = true;
		} catch (Exception e) {
			System.out.println("Error " + e.toString());
			return result;
		}
		return result;
	}

	@Override
	public Boolean archivarMensaje(Mensaje message) throws Exception {
		Boolean result = null;
		try {
			Mensaje tmpMensaje = (Mensaje) em
					.createNamedQuery("findUserMessage", Mensaje.class)
					.setParameter("Menssage", message)
					.setParameter("Buzon", message.getBuzon())
					.getSingleResult();
			if (tmpMensaje != null) {
				tmpMensaje.setEstado(EstadosMail.Archivar);
				em.merge(tmpMensaje);
				result = true;
			}
		} catch (Exception e) {
			return result;
		}
		return result;
	}

	@Override
	public Boolean borrarMensaje(Mensaje message) throws Exception {
		Boolean result = null;
		try {
			Mensaje tmpMensaje = (Mensaje) em
					.createNamedQuery("findUserMessage", Mensaje.class)
					.setParameter("Menssage", message)
					.setParameter("Buzon", message.getBuzon())
					.getSingleResult();
			if (tmpMensaje != null) {
				tmpMensaje.setEstado(EstadosMail.Papelera);
				em.merge(tmpMensaje);
				result = true;
			}
		} catch (Exception e) {
			return result;
		}
		return result;
	}

	@Override
	public List<Mensaje> listaMensajeEntrada(Usuario user) throws Exception {
		List<Mensaje> result = null;
		try {
			result = (List<Mensaje>) em.createNamedQuery("findStatusMessage")
					.setParameter("Buzon", user.getBuzon())
					.setParameter("Status", EstadosMail.Entrada)
					.getResultList();
		} catch (Exception e) {
			System.out.println("Error " + e.toString());
			return result;
		}
		return result;
	}

	@Override
	public List<Mensaje> listaMensajeEnviados(Usuario user) throws Exception {
		List<Mensaje> result = null;
		try {
			result = (List<Mensaje>) em.createNamedQuery("findStatusMessage")
					.setParameter("Buzon", user.getBuzon())
					.setParameter("Status", EstadosMail.Enviados)
					.getResultList();
		} catch (Exception e) {
			log.error("Error " + e.toString());
			return result;
		}
		return result;
	}
	
	
	@Override
	public List<Mensaje> listaMensajeInvitaciones(Usuario user) throws Exception {
		List<Mensaje> result = null;
		try {
			result = (List<Mensaje>) em.createNamedQuery("findStatusMessage")
					.setParameter("Buzon", user.getBuzon())
					.setParameter("Status", EstadosMail.Invitacion)
					.getResultList();
		} catch (Exception e) {
			log.error("Error " + e.toString());
			return result;
		}
		return result;
	}

	@Override
	public List<Mensaje> listaMensajeArchivados(Usuario user) throws Exception {
		List<Mensaje> result = null;
		try {
			result = (List<Mensaje>) em.createNamedQuery("findStatusMessage")
					.setParameter("Buzon", user.getBuzon())
					.setParameter("Status", EstadosMail.Archivar)
					.getResultList();
		} catch (Exception e) {
			System.out.println("Error " + e.toString());
			return result;
		}
		return result;
	}

	@Override
	public List<Mensaje> listaMensajePapelera(Usuario user) throws Exception {
		List<Mensaje> result = null;
		try {
			result = (List<Mensaje>) em.createNamedQuery("findStatusMessage")
					.setParameter("Buzon", user.getBuzon())
					.setParameter("Status", EstadosMail.Papelera)
					.getResultList();
		} catch (Exception e) {
			System.out.println("Error " + e.toString());
			return result;
		}
		return result;
	}

	@Override
	public void cabiarEstadoLeido(Mensaje message) throws Exception {
		try {
			Mensaje tmpMensaje = (Mensaje) em
					.createNamedQuery("findUserMessage", Mensaje.class)
					.setParameter("Menssage", message)
					.setParameter("Buzon", message.getBuzon())
					.getSingleResult();
			tmpMensaje.setEstadoLeido(message.getEstadoLeido());
			em.merge(tmpMensaje);
		} catch (Exception e) {
			System.out.println("Error " + e.toString());
		}
	}

}
